﻿#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>



//数组名的理解
//int main()
//{
//	int arr[10] = { 0 };
//	printf("arr      =%p\n", arr);
//	printf("arr+1    =%p\n", arr+1);//arr+1的地址相比于arr多了一个字节
//	printf("&arr[0]  =%p\n", &arr[0]);
//	printf("&arr[0]+1=%p\n", &arr[0]+1);//同上
//	printf("&arr     =%p\n", &arr);
//	printf("&arr+1   =%p\n", &arr+1);//&arr+1的地址相比于&arr多了正好10个字节
//	//总结，数组名arr相当于数组首元素的地址，&arr不同的是+1直接跳过整个数组
//	printf("%zd",sizeof(arr));
//	return 0;
//}



//使用指针访问数组
//int main()
//{
//	int arr[5] = { 0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* p = arr;
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		scanf("%d", p+i);
//		//1.&arr[i]
//		//2.p+i
//		//3.arr+i
//	}
//	for (i = 0; i < sz; i++)
//	{
//		printf("arr[%d]=%d\n", i, i[p]);//p=arr=&arr[0]
//		//1.*(arr+i)
//		//2.*(arr+i)
//		//3.arr[i]相当于*(arr+i)
//		//4.i[arr]与arr[i]表达相同
//		//5.p[i]相当于*arr(p+i)
//		//6.i[p]
//	}
//
//	return 0;
//}



//一堆数组的传参
//void Print(int arr[],int sz)//数组传参的时候，形参是可以写成数组的形式的，但本质上还是*指针变量*
//{
//	int sz2 = sizeof(arr) / sizeof(arr[0]);//在这里sizeof(arr)计算的是一个地址(指针变量)的大小，不是数组的大小
//	printf("sz2=%d\n", sz2);//x64（32位）下输出2；x86（64位）下输出1
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//int main()
//{
//	int arr[5] = { 0,1,2,3,4 };
//	int sz1 = sizeof(arr) / sizeof(arr[0]);//这里arr表示实参,sizeof(arr)计算一整个数组的大小
//	printf("sz1=%d\n", sz1);
//	Print(arr, sz1);
//	return 0;
//}
//void Print1(int arr[])
//{
//	printf("%d\n", sizeof(arr));//计算结果为4，为一个地址的大小,验证以上思路
//}
//void Print2(int* arr)
//{
//	printf("%d\n", sizeof(arr));//计算arr指针的大小,结果为4
//}
//int main()
//{
//	int arr[5] = { 0,1,2,3,4 };
//	Print1(arr);
//	Print2(arr);
//	return 0;
//}



//冒泡排序
//void bubble_sort(int arr[], int sz)
//{
//	int i = 0;
//	int j = 0;
//	while(sz)
//	{
//		int flag = 1;
//		for (i = 0; i < sz - 1; i++)
//		{
//			if (arr[i] > arr[i + 1])
//			{
//				int tmp = arr[i];
//				arr[i] = arr[i + 1];
//				arr[i + 1] = tmp;
//				flag = 0;
//			}
//		}
//		if (flag)
//			break;
//		sz--;
//	}
//}
//void Print(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//		printf("%d ", *(arr + i));
//	printf("\n");
//}
//int main()
//{
//	int arr[10] = { 2,5,6,4,7,8,9,1,3,0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	Print(arr, sz);
//	bubble_sort(arr, sz);
//	Print(arr, sz);
//	return 0;
//}



//二级指针
//int main()
//{
//	int a = 10;
//	int* p = &a;//p为一级指针
//	int** pp = &p;//pp为二级指针，三级及以上类推
//	printf("&a=%p\n", &a);
//	printf("p =%p\n", p);
//	printf("&p=%p\n", &p);
//	printf("pp=%p\n", pp);
//	return 0;
//}



//指针数组，存放指针的数组
//本质是数组
//int main()
//{
//	int* arrr[] = { 1,2 };
//	printf("%d\n", arrr[0]);
//	printf("%d\n", arrr[1]);//指向数据时跟int arr[]效果相同
//
//	int arr1[5] = { 0,1,2,3,4 };
//	int arr2[5] = { 10,11,12,13,14 };
//	int arr3[5] = { 20,21,22,23,24 };
//	int* arr[] = { arr1,arr2,arr3 };//这里int*换成int是不行的
//  //存放的是地址(如arr1)
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d ", arr[i][j]);//形式如同二维数组，但本质不是
//		}arr[i]选取,i为1选取指针arr2,arr2[j]相当于*(arr2+j)最终结果与形式如同二维数组
//		printf("\n");
//	}
//
//	return 0;
//}



